Micron Document
🎖️GitЯра🎖️

Node / meshtastic / Meshtastic-Android / files / feature / car / src / main / kotlin / org / meshtastic / feature / car / alerts / EmergencyHandler.kt

Displaying Raw • Download

feature/car/src/main/kotlin/org/meshtastic/feature/car/alerts/EmergencyHandler.kt 4e15ef1c7f68f8c683fe8b7ff741a5167e154d2e (4e15ef1c) Text, 4.17 KB

T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.feature.car.alerts

Tff7b72import T7ee787android.media.AudioManager
Tff7b72import T7ee787android.media.ToneGenerator
Tff7b72import T7ee787co.touchlab.kermit.Logger
Tff7b72import T7ee787kotlinx.coroutines.CoroutineExceptionHandler
Tff7b72import T7ee787kotlinx.coroutines.CoroutineScope
Tff7b72import T7ee787kotlinx.coroutines.Dispatchers
Tff7b72import T7ee787kotlinx.coroutines.SupervisorJob
Tff7b72import T7ee787kotlinx.coroutines.cancel
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.asStateFlow
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787org.koin.core.annotation.Single
Tff7b72import T7ee787org.meshtastic.feature.car.model.EmergencyAlert

T8b949e/**
* Manages emergency alert state for the car display. Observes incoming packets for emergency-priority messages,
* maintains active alert list, and triggers audio notifications.
*/
Tf0883e@Single
Tff7b72class T56d364EmergencyHandler Tb4b4b4{

Tff7b72private Tff7b72var Te6edf3scopeTb4b4b4: Te6edf3CoroutineScope? Tff7b72= Tff7b72null
Tff7b72private Tff7b72val Te6edf3_activeAlerts Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3EmergencyAlertTff7b72>Tff7b72>Tb4b4b4(Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72val Te6edf3activeAlertsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3ListTff7b72<Te6edf3EmergencyAlertTff7b72>Tff7b72> Tff7b72= Te6edf3_activeAlertsTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72val Te6edf3_latestAlert Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3EmergencyAlert?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
Tff7b72val Te6edf3latestAlertTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3EmergencyAlert?Tff7b72> Tff7b72= Te6edf3_latestAlertTb4b4b4.Te6edf3asStateFlowTb4b4b4(Tb4b4b4)

Tff7b72private Tff7b72var Te6edf3toneGeneratorTb4b4b4: Te6edf3ToneGenerator? Tff7b72= Tff7b72null

Tff7b72private Tff7b72val Te6edf3exceptionHandler Tff7b72= Te6edf3CoroutineExceptionHandler Tb4b4b4{ Te6edf3_Tb4b4b4, Te6edf3throwable Tff7b72-Tff7b72>
Te6edf3LoggerTb4b4b4.Te6edf3eTb4b4b4(Te6edf3tag Tff7b72= Ta5d6ff"Ta5d6ffEmergencyHandlerTa5d6ff"Tb4b4b4, Te6edf3throwable Tff7b72= Te6edf3throwableTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffEmergency flow collection failedTa5d6ff" Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffstartCollectingTb4b4b4(Te6edf3emergencyFlowTb4b4b4: Te6edf3FlowTff7b72<Te6edf3EmergencyAlertTff7b72>Tb4b4b4) Tb4b4b4{
Te6edf3scopeTff7b72?.Te6edf3cancelTb4b4b4(Tb4b4b4)
Te6edf3scope Tff7b72=
Te6edf3CoroutineScopeTb4b4b4(Te6edf3SupervisorJobTb4b4b4(Tb4b4b4) Tff7b72+ Te6edf3DispatchersTb4b4b4.Te6edf3Main Tff7b72+ Te6edf3exceptionHandlerTb4b4b4)Tb4b4b4.Te6edf3also Tb4b4b4{ Te6edf3newScope Tff7b72-Tff7b72>
Te6edf3newScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3emergencyFlowTb4b4b4.Te6edf3collect Tb4b4b4{ Te6edf3alert Tff7b72-Tff7b72>
Te6edf3addAlertTb4b4b4(Te6edf3alertTb4b4b4)
Te6edf3_latestAlertTb4b4b4.Te6edf3value Tff7b72= Te6edf3alert
Te6edf3playEmergencyToneTb4b4b4(Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffstopCollectingTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3scopeTff7b72?.Te6edf3cancelTb4b4b4(Tb4b4b4)
Te6edf3scope Tff7b72= Tff7b72null
Te6edf3toneGeneratorTff7b72?.Te6edf3releaseTb4b4b4(Tb4b4b4)
Te6edf3toneGenerator Tff7b72= Tff7b72null
Tb4b4b4}

Tff7b72fun Td2a8ffdismissAlertTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4) Tb4b4b4{
Te6edf3_activeAlertsTb4b4b4.Te6edf3value Tff7b72=
Te6edf3_activeAlertsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3alert Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3alertTb4b4b4.Te6edf3nodeNum Tff7b72=Tff7b72= Te6edf3nodeNumTb4b4b4) Te6edf3alertTb4b4b4.Te6edf3copyTb4b4b4(Te6edf3isActive Tff7b72= Tff7b72falseTb4b4b4) Tff7b72else Te6edf3alert Tb4b4b4}
Tb4b4b4}

Tff7b72fun Td2a8ffclearAllTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_activeAlertsTb4b4b4.Te6edf3value Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)
Tb4b4b4}

Tff7b72private Tff7b72fun Td2a8ffaddAlertTb4b4b4(Te6edf3alertTb4b4b4: Te6edf3EmergencyAlertTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3current Tff7b72= Te6edf3_activeAlertsTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3toMutableListTb4b4b4(Tb4b4b4)
T8b949e// Replace existing alert from same node, or add new
Tff7b72val Te6edf3existingIndex Tff7b72= Te6edf3currentTb4b4b4.Te6edf3indexOfFirst Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3nodeNum Tff7b72=Tff7b72= Te6edf3alertTb4b4b4.Te6edf3nodeNum Tb4b4b4}
Tff7b72if Tb4b4b4(Te6edf3existingIndex Tff7b72>Tff7b72= T79c0ff0Tb4b4b4) Tb4b4b4{
Te6edf3currentTff7b72[Te6edf3existingIndexTff7b72] Tff7b72= Te6edf3alert
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3currentTb4b4b4.Te6edf3addTb4b4b4(T79c0ff0Tb4b4b4, Te6edf3alertTb4b4b4) T8b949e// newest first
Tb4b4b4}
Te6edf3_activeAlertsTb4b4b4.Te6edf3value Tff7b72= Te6edf3current
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooGenericExceptionCaughtTa5d6ff"Tb4b4b4) T8b949e// ToneGenerator may throw various runtime exceptions
Tff7b72private Tff7b72fun Td2a8ffplayEmergencyToneTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72try Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3toneGenerator Tff7b72=Tff7b72= Tff7b72nullTb4b4b4) Tb4b4b4{
Te6edf3toneGenerator Tff7b72= Te6edf3ToneGeneratorTb4b4b4(Te6edf3AudioManagerTb4b4b4.Te6edf3STREAM_NOTIFICATIONTb4b4b4, Te6edf3TONE_VOLUMETb4b4b4)
Tb4b4b4}
Te6edf3toneGeneratorTff7b72?.Te6edf3startToneTb4b4b4(Te6edf3ToneGeneratorTb4b4b4.Te6edf3TONE_PROP_BEEPTb4b4b4, Te6edf3TONE_DURATION_MSTb4b4b4)
Tb4b4b4} Tff7b72catch Tb4b4b4(Te6edf3eTb4b4b4: Te6edf3RuntimeExceptionTb4b4b4) Tb4b4b4{
Te6edf3LoggerTb4b4b4.Te6edf3wTb4b4b4(Te6edf3tag Tff7b72= Ta5d6ff"Ta5d6ffEmergencyHandlerTa5d6ff"Tb4b4b4, Te6edf3throwable Tff7b72= Te6edf3eTb4b4b4) Tb4b4b4{ Ta5d6ff"Ta5d6ffEmergency tone playback failedTa5d6ff" Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tff7b72companion Tff7b72object Tb4b4b4{
Tff7b72private Tff7b72const Tff7b72val Te6edf3TONE_VOLUME Tff7b72= T79c0ff8T79c0ff0
Tff7b72private Tff7b72const Tff7b72val Te6edf3TONE_DURATION_MS Tff7b72= T79c0ff1T79c0ff0T79c0ff0T79c0ff0
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.2 - Generated in 0.04s